#python 最低适应版本 3.6
# 2023-04-29
#主分支:P光标控制
#更新:逻辑闭环,简化
import json
import os
from msvcrt import getwch as m #微软平台

def data():
    """控制位置"""
    global q,b,t,x,y
    da,ke=q[b][t][:]
    if y<0:
        x,y=x-1,len(ke)-1
    if y>=len(ke):
        x,y=x+1,0
    if x<0:
        x=0
    if x>len(da)-1:
        x=len(da)-1
    """以下格式化输出"""
    os.system("cls")
    print("Esc 退出 /新行并修改 *新行 - 删除行 . 跳转")
    print(f'Pg:{x//10:<2}|',end='')
    for k in range(len(ke)):
        print(f'({k}){ke[k]:7}',end='')
    print(end='\n')
    for x2 in range(x-x%10,min(x-x%10+10,len(da))):
        print(f'{str(x2):>5}|',end='')
        for y2 in range(len(ke)):
            if (x2,y2)==(x,y):
                print(f'[{da[x2][y2]:8}]',end='')
            else:
                print(f'{da[x2][y2]:10}',end='')
        print(end='\n')
    print(f'[{x}-{y}][{q[b][t][0][x][y]}]')
    """控制表格"""
    c=m()
    if c=='\x1b':
        return 0
    elif c=="\x00":
        v=m()
        if v=='H':x-=1
        elif v=='P':x+=1
        elif v=='K':y-=1
        elif v=='M':y+=1
        elif v=='I':x-=10
        elif v=='Q':x+=10
    elif c=='.':
        i=input('x,y:')
        if len(i.split(','))==2:
            i=i.split(',')
        elif len(i.split(' '))==2:
            i=i.split(' ')
        elif len(i.split('.'))==2:
            i=i.split('.')
        else:
            input('输入出错!')
            return 1
        x,y=map(int,i)
    elif 'a'<=c<='z':
        print(c,end='')
        c+=input()
        q[b][t][0][x][y]=c
        y+=1
    elif c=='=':
        q[b][t][0][x][y]=input('=')
    elif c=='+':
        q[b][t][0][x][y]+=input('=')
    elif c in('/','*'):
        x,y=len(da),0
        q[b][t][0].append(['*']*len(ke))
        if c=='/':
            for y2 in range(len(ke)):
                c2=input(f'{x}-{y2}=')
                if c2=='':
                    continue
                q[b][t][0][x][y2]=c2
    elif c=='-' and x!=0:
        q[b][t][0].pop(x)
        x-=1
    return 1


def key():
    """控制词头"""
    os.system("cls")
    print("q 退出 0~9 重命名,-0~9 删除,+ 添加(最多10个)")
    global q,b,t
    da,ke=q[b][t][:]
    lke=len(ke)
    for i in range(lke):
      print(i,ke[i])
    c=m()
    if c=='q':
        return 0
    if c=='+' and lke<10:
        q[b][t][1].append(input('添加+'))
        for i in range(len(da)):
            q[b][t][0][i].append('*')
    elif "0"<=c<str(lke):
        c=int(c)
        q[b][t][1][c]=input(str(ke[c])+'->')
    elif c=='-':
        print('删除-')
        c2=m()
        if "0"<=c2<str(lke):
            q[b][t][1].pop(int(c2))
            for i2 in range(len(da)):
                q[b][t][0][i2].pop(int(c2))
    return 1

q={}
file="unknow"
file_flag=False
b="unknow"
t="unknow"
file_content={True:"已打开,未按's'保存",False:"已关闭,需要按'o'打开"}
admit_content={True:"\n现在输入 空格 可以进入表格了!\n输入 k 修改表头",
               False:"\n请选择数据库和表格"}
#问题报错:在低版本命令行中\033[显示不全
help_init="""欢迎来到表格程序!
\033[1;36;40m
本软件可以自由复制修改分享!
邮箱:youngasusual@qq.com
\033[0m
直接输入:
o 打开文档
b 打开数据库
x 删除数据库
t 打开表格
d 删除表格
s 保存并退出文档
q 退出
使用中请使用英文模式
按任意键继续..."""

print(help_init)
m()
while True:
    """以下选择数据库,表格以及保存,加载内容."""
    os.system("cls")
    admit=b in q and t in q[b]
    print("?帮助 q退出")
    print("o文档",file,file_content[file_flag])
    if file_flag:
        print("b数据库(x 删除):")
        for ib in q:
            if ib==b:
                print('<',ib,'>',end="  ")
            else:
                print(ib,end="  ")
        print("\nt表格(d 删除):")
        if b in q:
            for it in q[b]:
                if it==t:
                    print('<',it,'>',end="  ")
                else:
                    print(it,end="  ")
        print(admit_content[admit])
    """"""
    flag=m()
    if flag=="q":#quit
        break
    elif flag=="o":#open
        os.system("cls")
        print("路径:",os.getcwd(),"\n你的文件:")
        for i in os.listdir():
            if os.path.isfile(i):
                print(i)
        file=input("输入以下要打开的文档名(直接输入可创建):")
        if os.path.isfile(file):#如果存在,以读取形式打开
            with open(file,"r") as book:
                q=json.loads(book.read())
            if q.get("root")=="TableEdit":
                q.pop("root")
                file_flag=True
            else:
                input("这个文件不符合格式要求!")
                file="unknow"
                file_flag=False
                b,t="unknow","unknow"
        else:#如果不存在,创建但不写入
            open(file,"w").close()
            input("该文件不存在,已创建")
            file_flag=True
            q={"base":{"table":[[["*"]],["*"]]}}#默认初始化
    elif flag=="s" and file_flag:#save
        with open(file,"w+") as book:
            flag_cover=input("是否覆盖?[y是/n否]")
            if flag_cover=="y":
                q.setdefault("root","TableEdit")#格式标记
                book.write(json.dumps(q))
                file_flag=False
    elif flag=="?":#help
        print(help_init)
        m()
    elif file_flag:
            if flag=='b':#选择base
                b=input("输入数据库:")
                q.setdefault(b,{})
            elif flag=='x':#删除base
                for i in range(len(q)):
                    print(i,list(q.keys())[i])
                del_b=input("输入数字删除:")
                if '0'<=del_b<str(len(q)):
                    q.pop(list(q)[int(del_b)])
            elif b in q and flag=='t':#选择table
                t=input("输入表格:")
                q[b].setdefault(t,[[['*']],['*']])
            elif b in q and flag=='d':#删除table
                for i in range(len(q[b])):
                    print(i,list(q[b]))
                del_t=input("输入数字删除:")
                if '0'<=del_t<str(len(q[b])):
                    q[b].pop(list(q[b])[int(del_t)])
            if admit:
                if flag==' ':#进入数据
                    x,y=0,0
                    while data():pass
                elif flag=='k':#编辑表头
                    while key():pass